package cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.sf;

import cn.iocoder.yudao.module.trade.framework.delivery.core.client.dto.sfexpress.sfExpressCreate.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.List;

import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT;

@NoArgsConstructor
@Data
public class SfCreateReqVO {

    @JsonProperty("language")
    @NotEmpty(message = "响应报文的语言不能为空")
    @Schema(description = "响应报文的语言， 缺省值为zh-CN，目前支持以下值zh-CN 表示中文简体， zh-TW或zh-HK或 zh-MO表示中文繁体， en表示英文")
    private String language;

    @JsonProperty("orderId")
    @NotEmpty(message = "客户订单号不能为空")
    @Schema(description = "客户订单号，重复使用订单号时返回第一次下单成功时的运单信息")
    private String orderId;

    @JsonProperty("waybillNoInfoList")
    @Schema(description = "顺丰运单号")
    private List<WaybillNoInfoDTO> waybillNoInfoList;

    @JsonProperty("customsInfo")
    @Schema(description = "报关信息，查看《海关配置流程指引》")
    private CustomsInfoDTO customsInfo;

    @JsonProperty("cargoDetails")
    @Schema(description = "托寄物信息")
    @NotEmpty(message = "托寄物信息不能为空")
    private List<CargoDetailsDTO> cargoDetails;

    @Schema(description = "拖寄物类型描述,如： 文件，电子产品，衣服等")
    @JsonProperty("cargoDesc")
    private String cargoDesc;

    @JsonProperty("extraInfoList")
    @Schema(description = "扩展属性")
    private List<ExtraInfoDTO> extraInfoList;

    @JsonProperty("serviceList")
    @Schema(description = "增值服务信息，支持附录： 《增值服务产品表》")
    private List<ServiceDTO> serviceList;

    @JsonProperty("contactInfoList")
    @Schema(description = "收寄双方信息")
    @NotEmpty(message = "收寄双方信息不能为空")
    private List<ContactInfoDTO> contactInfoList;

    @Schema(description = "顺丰月结卡号 月结支付时传值，现结不需传值；沙箱联调可使用测试月结卡号7551234567（非正式，无须绑定，仅支持联调使用）")
    @JsonProperty("monthlyCard")
    private String monthlyCard;

    @Schema(description = "付款方式，支持以下值： 1:寄方付 2:收方付 3:第三方付")
    @JsonProperty("payMethod")
    private Integer payMethod;

    @Schema(description = "快件产品类别， 支持附录 《快件产品类别表》 的产品编码值，仅可使用与顺丰销售约定的快件产品")
    @JsonProperty("expressTypeId")
    private Integer expressTypeId;

    @Schema(description = "包裹数，一个包裹对应一个运单号；若包裹数大于1，则返回一个母运单号和N-1个子运单号")
    @JsonProperty("parcelQty")
    private Integer parcelQty;

    @Schema(description = "客户订单货物总长，单位厘米， 精确到小数点后3位， 包含子母件")
    @JsonProperty("totalLength")
    private Integer totalLength;

    @Schema(description = "客户订单货物总宽，单位厘米， 精确到小数点后3位， 包含子母件")
    @JsonProperty("totalWidth")
    private Integer totalWidth;

    @Schema(description = "客户订单货物总高，单位厘米， 精确到小数点后3位， 包含子母件")
    @JsonProperty("totalHeight")
    private Integer totalHeight;

    @Schema(description = "订单货物总体积，单位立方厘米, 精确到小数点后3位，会用于计抛 (是否计抛具体商务沟通中 双方约定)")
    @JsonProperty("totalVolume")
    private Integer totalVolume;

    @JsonProperty("totalWeight")
    @Schema(description = "订单货物总重量（郑州空港海关必填）， 若为子母件必填， 单位千克， 精确到小数点后3位，如果提供此值， 必须>0 (子母件需>6)")
    private Double totalWeight;

    @JsonProperty("totalNetWeight")
    @Schema(description = "商品总净重")
    private Double totalNetWeight;

    @JsonProperty("sendStartTm")
//    @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT)
    @Schema(description = "要求上门取件开始时间， 格式： YYYY-MM-DD HH24:MM:SS， 示例： 2012-7-30 09:30:00 （预约单传预约截止时间，不赋值默认按当前时间下发，1小时内取件）")
    private String sendStartTm;

    @JsonProperty("isDocall")
    @Schema(description = "是否通过手持终端 通知顺丰收派 员上门收件，支持以下值： 1：要求 0：不要求")
    private Integer isDocall;

    @JsonProperty("isSignBack")
    @Schema(description = "是否返回签回单 （签单返还）的运单号， 支持以下值： 1：要求 0：不要求")
    private Integer isSignBack;

    @JsonProperty("custReferenceNo")
    @Schema(description = "客户参考编码：如客户原始订单号")
    private String custReferenceNo;

    @JsonProperty("temperatureRange")
    @Schema(description = "温度范围类型，当 express_type为12 医药温控件 时必填，支持以下值： 1:冷藏 3：冷冻")
    private Integer temperatureRangetemperatureRange;

    @JsonProperty("orderSource")
    @Schema(description = "订单平台类型 （对于平台类客户， 如果需要在订单中 区分订单来源， 则可使用此字段） 天猫:tmall， 拼多多：pinduoduo， 京东 : jd 等平台类型编码")
    private String orderSource;

    @JsonProperty("remark")
    @Schema(description = "备注")
    private String remark;

    @JsonProperty("isOneselfPickup")
    @Schema(description = "快件自取，支持以下值： 1：客户同意快件自取 0：客户不同意快件自取")
    private Integer isOneselfPickup;

    @JsonProperty("filterField")
    @Schema(description = "筛单特殊字段用来人工筛单")
    private String filterField;

    @JsonProperty("isReturnQRCode")
    @Schema(description = "是否返回用来退货业务的 二维码URL， 支持以下值： 1：返回二维码 0：不返回二维码")
    private Integer isReturnQRCode;

    @JsonProperty("specialDeliveryTypeCode")
    @Schema(description = "当EXPRESS_TYPE=235 2：极效前置单（当日达） 5：极效前置小时达 当EXPRESS_TYPE=265 4：预售电标")
    private String specialDeliveryTypeCode;

    @JsonProperty("specialDeliveryValue")
    @Schema(description = "特殊派件具体表述 证件类型: 证件后8位如： 1:09296231（1 表示身份证， 暂不支持其他证件）")
    private String specialDeliveryValue;

    @JsonProperty("merchantPayOrderNo")
    @Schema(description = "商户支付订单号")
    private String merchantPayOrderNo;

    @JsonProperty("isReturnSignBackRoutelabel")
    @Schema(description = "是否返回签回单路由标签： 默认0， 1：返回路由标签， 0：不返回")
    private Integer isReturnSignBackRoutelabel;

    @JsonProperty("isReturnRoutelabel")
    @Schema(description = "是否返回路由标签： 默认1， 1：返回路由标签， 0：不返回；除部分特殊用户外，其余用户都默认返回")
    private Integer isReturnRoutelabel;

    @JsonProperty("isUnifiedWaybillNo")
    @Schema(description = "是否使用国家统一面单号 1：是， 0：否（默认）")
    private Integer isUnifiedWaybillNo;

    @JsonProperty("podModelAddress")
    @Schema(description = "签单返还范本地址")
    private String podModelAddress;

    @JsonProperty("inProcessWaybillNo")
    @Schema(description = "头程运单号（郑州空港海关必填）")
    private String inProcessWaybillNo;

    @JsonProperty("isGenWaybillNo")
    @Schema(description = "是否需求分配运单号1：分配 0：不分配（若带单号下单，请传值0）")
    private Integer isGenWaybillNo;


}
